﻿#define _CRT_SECURE_NO_WARNINGS 1
// 原题连接：https://ac.nowcoder.com/acm/problem/229023
/*
题目描述：
链接：https://ac.nowcoder.com/acm/problem/229023
来源：牛客网

题目描述
𝑑
𝑑
dd当上了宣传委员，开始组织迎新晚会，已知班里有
𝑛
n个同学，每个同学有且仅有一个擅长的声部，把同学们分成恰好
𝑚
m组，为了不搞砸节目，每一组里的同学都必须擅长同一个声部，当然，不同组同学擅长同一个声部的情况是可以出现的，毕竟一个声部也可以分成好几个part进行表演，但是他不希望出现任何一组的人过多，否则可能会导致场地分配不协调，也就是说，她希望人数最多的小组的人尽可能少，除此之外，对组内人员分配没有其他要求，她希望你告诉她，这个值是多少，如果无法顺利安排，请输出-1
输入描述:
第一行两个数个数n,m(1≤m≤n≤100000)表示人数
接下来一行n个数,a[i](1≤a[i]≤n)表示第i个学生的擅长声部
输出描述:
输出一个数，表示人数最多的小组的人数
示例1
输入
复制
5 3
2 2 3 3 3
输出
复制
2
*/


#include <iostream>
#include <unordered_map>
using namespace std;
// 开始解题：
// 方法——二分 + 枚举
int n, m;
unordered_map<int, int> _hash;

bool check(int mid) {
    int cnt = 0;
    for (auto& [k, v] : _hash) {
        cnt += v / mid; // 将v个同声部的人分成v / mid组
        if (v % mid > 0) {
            cnt++; // 如果还有多余的话，就在多加一组
        }
    }
    return cnt <= m; // 最后的答案小于等于m则表示能分成功
}

int main() {
    scanf("%d%d", &n, &m);
    int x = 0;
    int _max = 0;
    int kinds = 0; // 表示不同声部的个数
    for (int i = 0; i < n; i++) {
        scanf("%d", &x);
        if (!_hash.count(x)) {
            kinds++;
        }
        _hash[x]++;
        _max = max(_max, _hash[x]);
    }
    if (kinds > m) {
        cout << -1 << endl;
        return 0;
    }
    int left = 1, right = _max;
    while (left < right) {
        int mid = (left + right) >> 1;
        if (check(mid)) {
            right = mid;
        }
        else {
            left = mid + 1;
        }
    }
    cout << right << endl;
    return 0;
}